package com.zjsru.plan2023.oneday;

/**
 * @Author: CookLee
 * @Date: 2023/7/26
 * 字母移位 II
 * 给你一个小写英文字母组成的字符串 s 和一个二维整数数组 shifts ，其中 shifts[i] = [starti, endi, directioni] 。
 * 对于每个 i ，将 s 中从下标 starti 到下标 endi （两者都包含）所有字符都进行移位运算，如果 directioni = 1 将字符向后移位，如果 directioni = 0 将字符向前移位。
 *、
 * 输入：s = "abc", shifts = [[0,1,0],[1,2,1],[0,2,1]]
 * 输出："ace"
 * 解释：首先，将下标从 0 到 1 的字母向前移位，得到 s = "zac" 。
 * 然后，将下标从 1 到 2 的字母向后移位，得到 s = "zbd" 。
 * 最后，将下标从 0 到 2 的字符向后移位，得到 s = "ace" 。
 *、
 * 输入：s = "dztz", shifts = [[0,0,0],[1,1,1]]
 * 输出："catz"
 * 解释：首先，将下标从 0 到 0 的字母向前移位，得到 s = "cztz" 。
 * 最后，将下标从 1 到 1 的字符向后移位，得到 s = "catz" 。
 */
public class ShiftingLetters {
    
    /**
     * 差分数组
     *
     * @param s      年代
     * @param shifts 转变
     * @return {@link String}
     */
    public String shiftingLetters(String s, int[][] shifts) {
        int len = shifts.length;
        //创建差分数组
        int[] diff = new int[len];
        
        char[] ch = s.toCharArray();
        //转化为ascii码 第一个转化后 后续循环中能够自动转化
        diff[0] = ch[0] - 'a';
        //差分值表示当前字符与前一个字符的字符差距
        for (int i = 1; i < diff.length; i++) {
            diff[i] = ch[i] - ch[i - 1];
        }
        //数组转换
        for (int i = 0; i < shifts.length; i++) {
            //决定前进或者后退
            int temp = shifts[i][2] == 0 ? -1 :1;
            //表示每个字符的移动距离
            diff[shifts[i][0]] += temp;
            //防止越界
            if(shifts[i][1] + 1 < diff.length){
                //操作范围结束处抵消之前的移动距离， 后续对数组转化的时候每个元素都有前一个元素决定，此处结尾值+1 减去修改步长后即可保证后续元素的正确性
                diff[shifts[i][1] + 1] -= temp;
            }
        }
        int[] temp = new int[diff.length];
        //计算最终的移位结果 意义和第一次处理头位相同
        temp[0] = (diff[0] % 26 + 26) % 26;
        ch[0] = (char)(temp[0] + 'a');
        for(int i = 1;i < temp.length;i++){
            temp[i] = ((diff[i] + temp[ i - 1]) % 26 + 26) % 26;
            ch[i] = (char)('a' + temp[i]);
        }
        return new String(ch);
    }
    
    public static void main(String[] args) {
        ShiftingLetters shiftingLetters = new ShiftingLetters();
        String s = "abc";
        int[][] shifts = new int[][] {{0, 1, 0}, {1, 2, 1}, {0, 2, 1}};
        System.out.println(shiftingLetters.shiftingLetters(s, shifts));
    }
}
